package com.doubao.user.service;

import com.doubao.common.result.Result;

/**
 * Token管理服务接口
 */
public interface TokenService {

    /**
     * 检查用户是否有足够的token余额
     *
     * @param userId 用户ID
     * @param requiredTokens 需要的token数量
     * @return 是否有足够的token
     */
    boolean hasEnoughTokens(Long userId, int requiredTokens);

    /**
     * 检查用户是否有足够的token发送消息
     *
     * @param userId 用户ID
     * @return 是否有足够的token
     */
    boolean hasEnoughTokensForMessage(Long userId);

    /**
     * 初始化用户token余额
     *
     * @param userId 用户ID
     * @return 初始化结果
     */
    Result<Void> initializeUserTokens(Long userId);

    /**
     * 消费用户Token
     *
     * @param userId 用户ID
     * @param promptTokens 输入token数量
     * @param completionTokens 输出token数量
     * @param sessionId 会话ID
     * @param messageId 消息ID
     * @param providerId AI提供商ID
     * @param modelId AI模型ID
     * @return 消费结果，成功返回Success
     */
    Result<Void> consumeTokens(Long userId, int promptTokens, int completionTokens,
                               Long sessionId, Long messageId, Long providerId, String modelId);

    /**
     * 预扣减Token (发送消息前先预扣减基础Token)
     *
     * @param userId 用户ID
     * @param baseTokens 基础token数量 (默认为10)
     * @return 预扣减结果
     */
    Result<Void> preDeductTokens(Long userId, int baseTokens);

    /**
     * 获取用户Token余额
     *
     * @param userId 用户ID
     * @return 用户Token余额
     */
    int getUserTokenBalance(Long userId);

    /**
     * 充值用户Token余额
     *
     * @param userId 用户ID
     * @param tokenAmount 充值的token数量
     * @return 充值结果
     */
    Result<Void> rechargeTokens(Long userId, int tokenAmount);

    /**
     * 获取用户消费历史
     *
     * @param userId 用户ID
     * @param page 页码
     * @param size 每页大小
     * @return 消费历史记录
     */
    Result<Object> getConsumptionHistory(Long userId, int page, int size);

    /**
     * 获取用户Token消费统计
     *
     * @param userId 用户ID
     * @param startDate 开始日期 (yyyy-MM-dd)
     * @param endDate 结束日期 (yyyy-MM-dd)
     * @return 消费统计数据
     */
    Result<Object> getConsumptionStats(Long userId, String startDate, String endDate);
}